﻿/********************************************************************************
** @ Date:2025/04/08
** @ Author: Gaojia
** @ Description: 测点类，继承自 CBaseNode，提供值、质量、时间戳等测点通用接口
** @ Version:1.1.1
** @ Fun: 支持类型判断、测点值设置、质量判断、时间戳记录等核心功能
********************************************************************************/

#ifndef CMEASUREPOINT_H
#define CMEASUREPOINT_H

#include "CBaseNode.h"
#include <QVariant>
#include <QPixmap>
#include <QDateTime>
#include <qreadwritelock.h>
// 测点数据类型枚举
enum class EPointType
{
	enAnalog,     // 模拟量（如温度、压力等连续值）
	enDigital,    // 开关   (如开关状态：开/关）
	enEnum,       // 枚举量（如有限选择的几种状态）
	enString,     // 字符串（如名称、描述等文本数据）
	enBitMask,    // 位标志（如一组二进制状态位）
	enFileRef     // 文件引用（如文件路径、图像等）
};

// 测点质量状态
enum class EPointQuality {
	enGood,       // 数据质量好
	enBad,        // 数据质量差
	enTimeOut,    // 数据超时
	enUncertain   // 数据质量不确定
};

class CMeasurePoint : public CBaseNode
{
	//Q_OBJECT
public:
	// 构造函数，初始化测点ID、名称、类型以及单位
	CMeasurePoint(const QString& sId, const QString& sName, const QString& sConfig = "", QObject* parent = nullptr, EPointType type = EPointType::enAnalog, const QString& unit = "");
	~CMeasurePoint();
	// 重写基类方法：启动测点（具体实现由子类提供）
	void start() override;

	// 重写基类方法：停止测点（具体实现由子类提供）
	void stop() override;

	// 重写基类方法：更新测点数据（具体实现由子类提供）
	void updateData() override;

	// 获取测点类型
	EPointType getType() const;

	// 获取测点状态
	EPointQuality getStatus() const;
	// 获取测点状态描述
	QString getStatusInfo()const;
	// 获取测点单位
	QString getUnit();

	// 获取测点的值
	QVariant getValue() const;

	// 获取测点的文件路径（例如图片或文件的路径）
	QString getFileRef() const;

	// 获取最后一次更新数据的时间
	QDateTime getLastUpdateTime() const;

	// 获取测点类型
	QString getValType() const;

	// 获取映射地址
	QString getMappedAddr() const;

	bool getIsAlarmPoint();

	//添加关联设备
	void addAssociated(CBaseNode* pNode);
	//删除关联设备
	void deleteAssociated(CBaseNode* pNode);
	//设置报警状态
	void setAlarmPoint(bool bAlarm = true);
	// 设置测点的状态
	void setStatus(EPointQuality status);

	// 设置测点单位
	void setUnit(const QString& unit);

	// 设置测点的值，并验证值的有效性
	virtual void setValue(const QVariant& value);

	// 设置测点的值，文件路径,并验证值的有效性
	virtual void setValue(const QVariant& value, const QString& fileRef);

	// 设置映射地址
	void setMappedAddr(QString& sMappedAddr);
protected:
	//初始化测点
	void initPoint();
protected:
	EPointType m_eType;                             // 测点类型
	QString m_sUnit;                                // 测点单位
	QVariant m_vValue;                              // 测点值，类型为 QVariant 支持多种类型
	EPointQuality m_eStatus;                        // 测点状态
	QDateTime m_lastUpdateTime;                     // 测点最后更新时间
	QString m_sFileRef;                             // 文件引用（图片或文件路径）
	bool isValidValue(const QVariant& value) const;	// 内部方法，用于验证测点值的有效性
	QVector<CBaseNode*>m_pVecBaseNode;             // 关联所有使用该测点的对象 当测点数据变化时通知其他测点更新
	QString m_sValType;                             // 数值类型 
	QString m_sMappedAddr;                          // 映射地址 测点数据的来源地址
	bool m_bAlarmPoint;                             // 是否是报警测点 true是  false 不是
	mutable QReadWriteLock m_rwLock;
};

#endif // CMEASUREPOINT_H
